package client;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

import DTO.ResumeAnnonceDTO;
import DTO.VendeurDTO;

/**
 * Classe décrivant la fenêtre Gestion de compte du vendeur apres sa connexion.
 * 
 * @author Julien Dubois
 * @version 1.0 (Mai 2012)
 */
@SuppressWarnings("serial")
public class ClientFenetreAccueilUneFoisConnecte extends JFrame implements ActionListener, WindowListener
{
	//DECLARATION DES VARIABLES DE LA CLASSE 
	
	/**
	 * Panel général de fond.
	 */
	private JPanel grandPanel = new JPanel();
	
	/**
	 * Panel principal contenant nos éléments.
	 */
	private JPanel panel;
	
	/**
	 * Layouts choisis pour agencer nos éléments.
	 */
	private BorderLayout borderLayoutPrincipal;
	private FlowLayout flowLayout;
	private GridLayout gridLayoutAnnonces ;
	
	/**
	 * ScrollPane pour avoir la scrollBar.
	 */
	private JScrollPane scrollPanel ;
	
	/**
	 * Bouton's de notre fenêtre.
	 */
	private JButton posterUneAnnonce, accederCompte, seDeconnecter, creerComtpe;
	
	/*
	 * Labelde la fenêtre.
	 */
	private JLabel labelprenom ;

	/**
	 * ComboBox de la fenêtre.
	 */
	@SuppressWarnings("rawtypes")
	private JComboBox combo;
	
	/**
	 * Panel utile pour l'affichage des annonces en rapport avec le vendeur.
	 */
	private JPanel panelIntermediaire ;

	/**
	 * Booleen de notre fenêtre.
	 */
	//le booleen quitter sert à assurer proprement la fermeture de la connexion avec le serveur. 
	private boolean quitter = true;
	
	
	//les variables static ci-dessous, sont static car il faut pouvoir s'en rapeller quand on rafraichit la fenêtre.
	/**
	 * String de la fenêtre.
	 */
	private static String tri = "" ;
	
	
	/**
	 * Booleens de la fenêtre;
	 */
	private static boolean triage_annonnce_objet = false  ;
	private static boolean triage_annonce_emploi = false ;
	private static boolean triage  ;
	
	//CONSTRUCTEUR DE LA FENETRE
	
	/**
	 * Constructeur par défaut.
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public ClientFenetreAccueilUneFoisConnecte()
	{
		/*
		 * Va nous pemettre d'utiliser this.dispose pour disposer d'un fenêtre quand on en a plus besoin (pour la fermer)
		 * Ce bout de code sert à fermer la connexion avec le serveur proprement (pas de message d'erreur) lorsque l'on clique sur la croix rouge.
		 */
		this.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent arg0)
			{
				if(quitter)
				{
					ClientCommunication.getInstance().fermerConnexion();
				}
			}
		});
		
		this.setTitle("Petites Annonces - Accueil");
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		this.setVisible(true);
		
		//on définit la taille de la fenêtre
		//600x660 pour respecter au mieux la taille de l'image d'accueil.
		this.setSize(600,660);
		
		//On n'empêche le redimensionnement.
		this.setResizable(false);
		
		//On colore le panel dans un gris sympathique et soyeux.
		grandPanel.setBackground(Color.LIGHT_GRAY);
		this.setContentPane(grandPanel);
		
		
		//BorderLayout pour agencer nos éléments.
		borderLayoutPrincipal = new BorderLayout();
		this.setLayout(borderLayoutPrincipal);
		
		
		
		//PERSONNALISATION DE LA FENETRE A PARTIR DICI 
		
		
		//Déclaration de notre FlowLayout
		flowLayout = new FlowLayout();
		
		
		//Association Layout <-> Panel + CENTER + couleur.
		panel = new JPanel();
		panel.setLayout(flowLayout);
		this.getContentPane().add(panel, BorderLayout.CENTER);
		panel.setBackground(Color.LIGHT_GRAY);
		
		// ON DISPOSE DES ELEMENTS DE NOTRE FENETRE DANS panel.

		//Label informatif.
		String prenom = new String(ClientCommunication.getInstance().getVendeurStocke().getPrenom());
		labelprenom = new JLabel("Bienvenue " + prenom + " !!");
		labelprenom.setPreferredSize(new Dimension(120, 20));
		panel.add(labelprenom);
		

		//Bouton "Poster..."
		posterUneAnnonce = new JButton("Poster une annonce");
		posterUneAnnonce.setPreferredSize(new Dimension(150, 25));
		panel.add(posterUneAnnonce);
		posterUneAnnonce.addActionListener(this);
		
		
		//Bouton "Acceder..."
		accederCompte = new JButton("Acceder à mon compte");
		accederCompte.setPreferredSize(new Dimension(170, 25));
		panel.add(accederCompte);
		accederCompte.addActionListener(this);
		
		
		//Bouton "Se déconnecter"
		seDeconnecter = new JButton("Se déconnecter");
		seDeconnecter.setPreferredSize(new Dimension(130, 25));
		panel.add(seDeconnecter);
		seDeconnecter.addActionListener(this);
		
		
		//Espace pour agencer nos éléments.
		JLabel espacevide2 = new JLabel();
		espacevide2.setPreferredSize(new Dimension(450, 30));
		panel.add(espacevide2);
		

		//Bouton "Créer..."
		creerComtpe = new JButton("Creer un compte");
		creerComtpe.setPreferredSize(new Dimension(130, 25));
		panel.add(creerComtpe);
		creerComtpe.addActionListener(this);
		
		
		//Espace pour agencer nos éléments.
		JLabel espacevide3 = new JLabel();
		espacevide3.setPreferredSize(new Dimension(410, 30));
		panel.add(espacevide3);
		

		//ComboBox contenant les options de tri.
		combo = new JComboBox();
		combo.setPreferredSize(new Dimension(180, 20));
		combo.addItem("Trier");
		combo.addItem("Date");
		combo.addItem("Département");
		combo.addItem("Offres d'Emplois/Stages");
		combo.addItem("Ventes Objets/Services");
		panel.add(combo);
		
		
		//on change l'option d'affichage du comboBox.
		if (triage == false)
		{
			combo.setSelectedItem(0);
		}
		
		else if (tri.equals("surDate"))
		{
			combo.setSelectedIndex(1);
		}
		
		else if (tri.equals("surDepartement"))
		{
			combo.setSelectedIndex(2);	
		}
		
		else if (tri.equals("surType") && triage_annonce_emploi)
		{
		combo.setSelectedIndex(3);
		}
		
		else if (tri.equals("surType") && triage_annonnce_objet)
		{
		combo.setSelectedIndex(4);
		}
		
		//on récupère les annonces du vendeur courant.
		int id_vendeur = ClientCommunication.getInstance().getVendeurStocke().getId();
		List<ResumeAnnonceDTO> listeAnnoncesAssocieesVendeur = ClientCommunication.getInstance().recupererAnnoncesVendeur(id_vendeur);
		

		
		//ici on applique une action sur les annonces en fonction du champs choisi dans la JComboBox.
        class ItemAction implements ActionListener
        {
                public void actionPerformed(ActionEvent e) 
                {
                        System.out.println("ActionListener : action sur " + combo.getSelectedItem());

                        if (combo.getSelectedItem().equals("Trier"))
                        {
                        	triage = false ;
                        	//on rafraichit la page.
                			ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreUneFoisConnecte");
                			dispose();
                			triage_annonce_emploi = false ; 
                			triage_annonnce_objet = false ; 
                        }
                        
                        if (combo.getSelectedItem().equals("Date"))
                        {
                        	triage = true ;
                        	tri = "surDate";
                        	//on rafraichit la page.
                			ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreUneFoisConnecte");
                			dispose();
                			triage_annonce_emploi = false ; 
                			triage_annonnce_objet = false ; 
                        }
                        if (combo.getSelectedItem().equals("Département"))
                        {
                        	triage = true ;
                        	tri = "surDepartement";
                        	//on rafraichit la page.
                			ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreUneFoisConnecte");
                			dispose();
                			triage_annonce_emploi = false ; 
                			triage_annonnce_objet = false ; 
                        }
                        if (combo.getSelectedItem().equals("Offres d'Emplois/Stages"))
                        {
                    			triage = true ;
                        	    tri = "surType";
                        		triage_annonce_emploi = true ; 
                        		triage_annonnce_objet = false ;
                            	//on rafraichit la page.
                    			ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreUneFoisConnecte");
                    			dispose();
    
                        }	
                        if (combo.getSelectedItem().equals("Ventes Objets/Services"))
                        {
                    		triage = true ;
                        	tri = "surType";
                    		triage_annonce_emploi = false ; 
                    		triage_annonnce_objet = true ;
                			ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreUneFoisConnecte");
                			dispose();
                        }	
                        
                }               
        }
    
		//Ajout du listener.
        ItemAction itemAction = new ItemAction();
		combo.addActionListener(itemAction);
		
		
		//Espace pour agencer nos éléments.
		JLabel espacevide4 = new JLabel();
		espacevide4.setPreferredSize(new Dimension(350, 30));
		panel.add(espacevide4);

		//On affiche le panel.
		panel.setVisible(true);
			

		//AFFICHAGE DES ANNONCES EN RAPPORT AVEC LE VENDEUR
		

		//on utilise un GridLayout pour afficher les annonces.
		gridLayoutAnnonces = new GridLayout();
		gridLayoutAnnonces.setColumns(3);
		
		int lignes = listeAnnoncesAssocieesVendeur.size();
		
		if(triage)
		{
			if(triage_annonce_emploi)
			{
				lignes = 0;
				
				for(ResumeAnnonceDTO r : listeAnnoncesAssocieesVendeur)
				{
					if(r.isObjet_service())
					{
						continue;
					}
					
					lignes++;
				}
			}
			else if(triage_annonnce_objet)
			{
				lignes = 0;
				
				for(ResumeAnnonceDTO r : listeAnnoncesAssocieesVendeur)
				{
					if(r.isEmploi_stage())
					{
						continue;
					}
					
					lignes++;
				}
			}
		}
		
		// On ajoute 1 car la prmière ligne contient le nom des colonnes du tableau
		gridLayoutAnnonces.setRows(lignes+1);
		
		
		//panel qui reçoit les panel Head1 - Head2 - Head3.
		panelIntermediaire = new JPanel();
		panelIntermediaire.setLayout(gridLayoutAnnonces);
		panelIntermediaire.setBackground(Color.LIGHT_GRAY);
		panelIntermediaire.setMaximumSize(new Dimension(400, 400));

		
		JPanel panelHead1 = new JPanel();
		panelHead1.add(new JLabel("Date"));
		panelHead1.setPreferredSize(new Dimension(180, 30));
		panelHead1.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		panelHead1.setBackground(Color.LIGHT_GRAY);
		
		JPanel panelHead2 = new JPanel();
		panelHead2.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		panelHead2.setBackground(Color.LIGHT_GRAY);
		panelHead2.add(new JLabel("Annonces"));
		
		JPanel panelHead3 = new JPanel();
		panelHead3.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		panelHead3.setBackground(Color.LIGHT_GRAY);
		panelHead3.add(new JLabel(""));
		
		panelIntermediaire.add(panelHead1);
		panelIntermediaire.add(panelHead2);
		panelIntermediaire.add(panelHead3);
		

		//Panel scrollable.
		scrollPanel = new JScrollPane(panelIntermediaire);
		scrollPanel.setMinimumSize(new Dimension(400, 50));
		scrollPanel.setMaximumSize(new Dimension(400, 400));
		scrollPanel.setPreferredSize(new Dimension(570, 430));
		scrollPanel.setWheelScrollingEnabled(true);
		panel.add(scrollPanel);

		
		//Panel qui va accueillir la checkBox et le bouton "Modifier" dans la troisème colonne.
		JPanel jpanel = null ; 
		JButton btn ; 

		
		//EN FONCTION DU CHOIX FAIT SUR LE COMBOBOX ON AFFICHE LA LISTE ADEQUATE.
		//si tirage vaut false on affiche la liste non classée sinon on rentre ici.
		
		List<ResumeAnnonceDTO> listeAnnonce = new ArrayList<ResumeAnnonceDTO>(listeAnnoncesAssocieesVendeur);
		
		if (triage == true)
		{
			//en fonction de la valeur de "tri" on affiche la liste correspondante.
			if (tri.equals("surDate"))
			{
		    	listeAnnonce = ResumeAnnonceDTO.trierParDate(listeAnnonce);

			}
			
			else if (tri.equals("surDepartement"))
			{
		    	listeAnnonce = ResumeAnnonceDTO.trierParDepartement(listeAnnonce);
			}
		}	

			
			for (ResumeAnnonceDTO resume : listeAnnonce)
			{
				if (triage_annonnce_objet)
				{
					if (resume.isEmploi_stage())
					{
					continue;
					}
				}
				else if (triage_annonce_emploi)
				{
					if (resume.isObjet_service())
					{
					continue;
					}
				}
				
				jpanel = new JPanel() ;
				jpanel.add(new JLabel(resume.getDate().toString()));
				jpanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
				jpanel.setBackground(Color.LIGHT_GRAY);
				panelIntermediaire.add(jpanel);
				
				jpanel = new JPanel();
				JTextArea labelTitre = new JTextArea(resume.getTitre().toString());
				labelTitre.setLineWrap(true);
				labelTitre.setPreferredSize(new Dimension(170, 30));
				labelTitre.setEditable(false);
				labelTitre.setFocusable(false);
				labelTitre.setBackground(Color.LIGHT_GRAY);
				jpanel.add(labelTitre);
				jpanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
				jpanel.setBackground(Color.LIGHT_GRAY);
				panelIntermediaire.add(jpanel);
				
				
				btn = new JButton(">");
				final int id = resume.getId();
				
				
				btn.addActionListener(new ActionListener()
				{
					public void actionPerformed(ActionEvent arg0)
					{
						ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreVoirAnnonce", id);
						dispose();
					}
				});
				jpanel = new JPanel() ; 
				jpanel.add(btn);
				panelIntermediaire.add(jpanel);
				jpanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
				jpanel.setBackground(Color.LIGHT_GRAY);
				
			}
		
		//panel intermédiaire visble.
		panelIntermediaire.setVisible(true);	
	}

	
	
	// ACTIONS SUR LES BOUTONS
	
	public void actionPerformed(ActionEvent e)
	{
		Object event = e.getSource();
		
		//Clic sur le bouton "Acceder..."
		if (event == accederCompte)
		{
			quitter = false;
			ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreGestionDeCompte");
			this.dispose();
		}
		
		//Clic sur le bouton "Se déconnecter..."
		if (event == seDeconnecter)
		{
			quitter = false;
			ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreAccueil");
			VendeurDTO vendeur = ClientCommunication.getInstance().getVendeurStocke();
			vendeur.setId(-1);
			ClientCommunication.getInstance().setVendeurStocke(vendeur);
			this.dispose();
		}
		
		//Clic sur le bouton "Creer..."
		if (event == creerComtpe)
		{
			quitter = false;
			ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreCreerUnCompteDejaConnecte");
			this.dispose();
		}
		
		//Clic sur le bouton "Poster..."
		if (event == posterUneAnnonce)
		{
			quitter = false;
			ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetrePosterAnnonce");
			this.dispose();
		}
		
	}

	//Méthodes implémentées de WindowListener, on ne les utilisent pas.

	@Override
	public void windowActivated(WindowEvent e)
	{
		
	}



	@Override
	public void windowClosed(WindowEvent e)
	{
		
	}



	@Override
	public void windowClosing(WindowEvent e)
	{
		
	}



	@Override
	public void windowDeactivated(WindowEvent e)
	{
		
	}



	@Override
	public void windowDeiconified(WindowEvent e)
	{
		
	}



	@Override
	public void windowIconified(WindowEvent e)
	{
		
	}



	@Override
	public void windowOpened(WindowEvent e)
	{
		
	}

}
